/* 
 * AgendaController.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.controller;

import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

import org.primefaces.event.ScheduleEntryMoveEvent;
import org.primefaces.event.ScheduleEntryResizeEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.DefaultScheduleEvent;
import org.primefaces.model.DefaultScheduleModel;
import org.primefaces.model.ScheduleEvent;
import org.primefaces.model.ScheduleModel;

import br.com.pma.chamatec.business.IAgendaBO;
import br.com.pma.chamatec.business.IChamadoBO;
import br.com.pma.chamatec.dominio.TipoSituacao;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.entity.Agenda;
import br.com.pma.entity.Chamado;

/**
 * Controlador para o Caso de Uso Agendar Chamado.
 *
 * @author Ludemeula Fernandes de Sá
 */
@ManagedBean
@ViewScoped
public class AgendaController extends AbstractController {
	private static final long serialVersionUID = -2896421731853780422L;
	
	@Inject
	private IAgendaBO agendaBO;

	@Inject
	private IChamadoBO chamadoBO;

	@Inject
	private Agenda agenda;

	@Inject
	private Chamado chamado;

	private List<Agenda> agendas;
	private List<Chamado> chamados;

	private ScheduleModel scheduleModel;

	private Boolean isExcluir = true;
	
	/**
	 * @see br.com.pma.chamatec.controller.AbstractController#init()
	 */
	@Override
	@PostConstruct
	public void init() {
		super.init();
		try {
			inicializarObjetos();
	        chamados = chamadoBO.getListDescricao();

	        pesquisar();
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Pesquisa os itens da agenda.
	 * 
	 */
	public void pesquisar() {
		try {
			scheduleModel = new DefaultScheduleModel();
			agendas = null;
	        agendas = agendaBO.pesquisar();
	
			for (Agenda agenda : agendas){
	            DefaultScheduleEvent evento = new DefaultScheduleEvent();
	            evento.setEndDate(agenda.getDataFim());
	            evento.setStartDate(agenda.getDataInicio());
	            evento.setTitle(agenda.getChamado().getResumo());
	            evento.setData(agenda.getId());
	            evento.setEditable(true);
	
	            if (agenda.getChamado().getIsExecutado().equals(TipoSituacao.EXECUTADO.getCodigo())){
	                evento.setStyleClass("executado");
	            } else {
	                evento.setStyleClass("global");
	            }
	 
	            scheduleModel.addEvent(evento);
	        }
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}
	
	/**
	 * Inicializa os objetos de Agenda.
	 * 
	 */
	public void inicializarObjetos() {
		agenda = new Agenda();
		Chamado chamado = new Chamado();
		agenda.setChamado(chamado);
	}

	/**
	 * Inicia um novo agendamento.
	 * 
	 * @param selectEvent
	 */
	public void novo(SelectEvent selectEvent) {
		inicializarObjetos();
		ScheduleEvent scheduleEvent = new DefaultScheduleEvent("", (Date) selectEvent.getObject(), (Date) selectEvent.getObject());
		
		agenda.setDataInicio(scheduleEvent.getStartDate());
		agenda.setDataFim(scheduleEvent.getEndDate());
		setIsExcluir(false);
	}

	 /**
     * Evento quando um usuário seleciona um evento já existente.
     * 
     * @param selectEvent
     */
    public void selecionado(SelectEvent selectEvent) {  
        ScheduleEvent scheduleEvent = (ScheduleEvent) selectEvent.getObject();  
 
        for(Agenda objAgenda : agendas){
            if(objAgenda.getId() == (Long) scheduleEvent.getData()){
                agenda = objAgenda;
                break;
            }
        }
        setIsExcluir(true);
    }  
 
    /**
     * Evento quando o usuário move um evento através de 'drag and drop'.
     * 
     * @param scheduleEntryMoveEvent
     */
    public void movido(ScheduleEntryMoveEvent scheduleEntryMoveEvent) {  
        for(Agenda objAgenda : agendas){
            if(objAgenda.getId() == (Long) scheduleEntryMoveEvent.getScheduleEvent().getData()){
                agenda = objAgenda;
                salvar();
                break;
            }
        }
        setIsExcluir(true);
    }
 
    /**
     * Evento quando o usuario 'redimenciona' um evento.
     * 
     * @param scheduleEntryResizeEvent
     */
    public void redimencionado(ScheduleEntryResizeEvent scheduleEntryResizeEvent) {  
 
        for(Agenda objAgenda : agendas){
            if(objAgenda.getId() == (Long) scheduleEntryResizeEvent.getScheduleEvent().getData()){
                agenda = objAgenda;
                salvar();
                break;
            }
        }
        setIsExcluir(true);
    }  
	
	/**
	 * Salva um agendamento.
	 * 
	 */
	public void salvar() {
		try {
			agenda = agendaBO.salvar(agenda);
			pesquisar();
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}

	/**
	 * Remove o agendamento do chamado selecionado.
	 * 
	 */
	public void excluir() {
		try {
			agendaBO.remover(agenda);
			pesquisar();
		} catch (ChamatecNegocioException e) {
			addFacesMessage(e.getMessage(), FacesMessage.SEVERITY_ERROR);
		} catch (Exception e) {
			montaMensagemGenerica(e);
		}
	}
	/********************************************* Getters e Setters *****************************************************/
	/**
	 * @return the agenda
	 */
	public Agenda getAgenda() {
		return agenda;
	}

	/**
	 * @param agenda the agenda to set
	 */
	public void setAgenda(Agenda agenda) {
		this.agenda = agenda;
	}

	/**
	 * @return the chamado
	 */
	public Chamado getChamado() {
		return chamado;
	}

	/**
	 * @param chamado the chamado to set
	 */
	public void setChamado(Chamado chamado) {
		this.chamado = chamado;
	}

	/**
	 * @return the agendas
	 */
	public List<Agenda> getAgendas() {
		return agendas;
	}

	/**
	 * @param agendas the agendas to set
	 */
	public void setAgendas(List<Agenda> agendas) {
		this.agendas = agendas;
	}

	/**
	 * @return the chamados
	 */
	public List<Chamado> getChamados() {
		return chamados;
	}

	/**
	 * @param chamados the chamados to set
	 */
	public void setChamados(List<Chamado> chamados) {
		this.chamados = chamados;
	}

	/**
	 * @return the scheduleModel
	 */
	public ScheduleModel getScheduleModel() {
		return scheduleModel;
	}

	/**
	 * @param scheduleModel the scheduleModel to set
	 */
	public void setScheduleModel(ScheduleModel scheduleModel) {
		this.scheduleModel = scheduleModel;
	}

	/**
	 * @return the isExcluir
	 */
	public Boolean getIsExcluir() {
		return isExcluir;
	}

	/**
	 * @param isExcluir the isExcluir to set
	 */
	public void setIsExcluir(Boolean isExcluir) {
		this.isExcluir = isExcluir;
	}
}